home *** CD-ROM | disk | FTP | other *** search
/ Languguage OS 2 / Languguage OS II Version 10-94 (Knowledge Media)(1994).ISO / language / embedded / mcu / float09.arc / UTIL.SA < prev    next >
Text File  |  1987-03-04  |  7KB  |  315 lines

  1. *
  2.   NAM UTIL
  3.   TTL  UTILITARIAN ARITHMETIC SUPPORT ROUTINES
  4. *
  5. *      DEFINE EXTERNAL REFERENCES
  6. *
  7.   XDEF    XSUBY,XADDY,NORMQK,NORM1,DNORM1,FPMOVE
  8.   XDEF    VALID,FRCTAB,BITTBL,SHIFTR,COMP2,FILSKY
  9.   XDEF    DENORM
  10. *
  11.   XREF    CKINVD,CHKOVF,CHKUNF,OVFLNT,UNFLNT,ROUND
  12.   XREF    TFRACT,ADBIAS,SUBIAS,GOSET
  13. *
  14. *
  15. *    REVISION HISTORY:
  16. *      DATE      PROGRAMMER        REASON
  17. *
  18. *    23.MAY.80      G.WALKER        ORIGINAL
  19. *    1.JULY.80      G.WALKER        REDUCE SIZE
  20. *    14.JUL.80      G. STEVENS        REDUCE SIZE AND
  21. *                    ADD COMP2 ROUTINE
  22. *    30.JUL.80      G. WALKER        CORRECT 'VALID' SO 'SUBIAS'
  23. *                      DOES NOT TRIGGER OVF TEST
  24. *    06.AUG.80      G. WALKER        'VALID': POINT X TO RSLT FOR ROUND
  25. *    12.AUG.80      G. STEVENS         ADD FILSKY & DENORM UTILITIES
  26. *    06.OCT.80      G. STEVENS         FIX ADDR. MODE ERROR IN FILSKY
  27. *    09.OCT.80      G.WALKER         FIX G-BYTE OFFSET BACK TO ORIG
  28. *    12.DEC.80      G. STEVENS         ADD CALL TO ROUND IN 'VALID'
  29. *    19.DEC.80      G. WALKER         CHANGE IFCC CS TO IFCC EQ
  30. *                     IN DNORM1.
  31. *
  32. *
  33.   PAG
  34. ******************************************************
  35. *
  36. *     TABLE OF FRACTION SIZES IN BYTES AND BITS.
  37. *
  38. FRCTAB    FCB  4,7,9,4,7         PRECISION IN BYTES
  39. BITTBL    FCB  26,55,66,26,55  PRECISION IN BITS + GUARD BIT
  40. *
  41. *************************************************
  42. *
  43. *    XSUBY --
  44. *     SUBTRACTS THE 9-BYTE FRACTION POINTED TO BY
  45. *    XREG FROM THE 9-BYTE FRACTION POINTED TO BY
  46. *    THE YREG.    RESULT IS LEFT IN FRACTION POINTED BY
  47. *    THE XREG.
  48. *     BASHES D AND CC.
  49. *
  50. XSUBY EQU *
  51.   XSBTRY       SUBTRACT 9 BYTES AT X FROM BYTES AT Y
  52.   RTS
  53. *
  54. *******************************************
  55. *
  56. *    NORMQK --
  57. *     PERFORMS A QUICK, MULTI-BIT NORMALIZE
  58. *    ON THE INTERNAL FP NUMBER POINTED TO BY X.
  59. *     BASHES D AND CC.
  60. *
  61. NORMQK EQU *
  62.   LBSR TFRACT        TEST FOR ZERO FRACTION
  63.   IFCC    NE
  64. NRMQA EQU  *
  65.     IFTST  (FRACT,X),GE,#0
  66.       CLRA
  67.       LSHIFT FRACT,X,9 SHIFT FRACTION LEFT ONE BIT
  68.       LDD  EXP,X
  69.       SUBD #1          DECREMENT EXPONENT TO COMPENSATE
  70.       STD  EXP,X    FOR LEFT SHIFT OF FRACTION
  71.       BRA  NRMQA
  72.      ENDIF
  73.   ENDIF       FRACTION IS NOT ZERO
  74.   RTS
  75. *
  76. ***************************************************
  77. *
  78. *    NORM1 --
  79. *     NORMALIZES THE INTERNAL FP NUMBER POINTED TO
  80. *    BY THE X REGISTER ONE BIT TO THE LEFT ONLY.
  81. *     BASHES D AND CC.
  82. *
  83. NORM1 EQU *
  84.   CLRA       CLEAR C BIT
  85.   LSHIFT  FRACT,X,9
  86.   LDD    EXP,X
  87.   SUBD    #1
  88.   STD    EXP,X
  89.   RTS
  90. ***************************************************
  91. *
  92. *    DNORM1 --
  93. *     DENORMALIZES THE INTERNAL FP NUMBER POINTED
  94. *    TO BY THE X-REGISTER ONE BIT TO THE RIGHT.
  95. *    THE CARRY BIT IS SHIFTED INTO THE MSB AND
  96. *    THE EXPONENT IS INCREMENTED TO MAINTAIN THE
  97. *    NUMBER UNCHANGED IN VALUE.
  98. *
  99. DNORM1 EQU *
  100.   RSHIFT  FRACT,X,9
  101.   INC  EXP+1,X
  102.   IFCC    EQ            IF CARRY OUT,
  103.     INC  EXP,X              PROPAGATE IT.
  104.   ENDIF
  105.   RTS
  106. **************************************************
  107. *
  108. *    XADDY --
  109. *     ADDS MANTISSA (9 BYTES LONG) POINTED TO
  110. *    BY X-REGISTER TO MANTISSA POINTED TO BY Y-REGISTER
  111. *    AND REPLACES X-MANTISSA WITH RESULT.  THE CARRY
  112. *    OUT OF THE HIGH-ORDER BYTE OF RESULT IS LEFT
  113. *    IN THE CARRY FLAG OF THE CC-REGISTER.
  114. *     BASHES: D AND CC.
  115. *
  116. XADDY EQU *
  117.   XPLUSY    ADD 9 BYTES AT X TO BYTES AT Y
  118.   RTS
  119. *****************************************************
  120. *
  121. *    VALID --
  122. *     VALIDATES THE FLOATING-POINT RESULT AND
  123. *    CALLS THE APPROPRIATE EXCEPTION-HANDLING
  124. *    ROUTINES, IF NECESSARY.
  125. *
  126. VALID EQU *
  127.   LBSR    CHKUNF
  128.   IFCC    EQ        IF UNDERFLOW
  129.     LDX  PFPCB,U
  130.     LDA  ENB,X
  131.     ANDA #ENBUNF
  132.     IFCC NE           IF ENABLED
  133.       LBSR  ADBIAS
  134.       LBSR  ROUND      DELIVER ROUNDED RESULT TO TRAP HANDLER
  135.     ELSE
  136.       LBSR  UNFLNT
  137.     ENDIF
  138.   ELSE            ROUND AND CHECK FOR OVERFLOW
  139.     LEAX  RESULT,U    POINT X TO RESULT
  140.     LBSR  ROUND        ROUND RESULT
  141.     LBSR  CKINVD       CHECK FOR INVALID
  142.     LBSR  CHKOVF
  143.     IFCC  EQ          IF OVERFLOW
  144.       LDX  PFPCB,U
  145.       LDA  ENB,X
  146.       ANDA #ENBOVF
  147.       IFCC NE**************************
  148. *
  149. *    FPMOVE --
  150. *     MOVES A FLOATING-POINT NUMBER POINTED TO
  151. *    BY XREG TO THE MEMORY POINTED TO BY YREG.    NO
  152. *    LOOP IS USED, SO IT IS VERY FAST.
  153. *
  154. *    ON EXIT:  NO REGISTERS CHANGED.
  155. *
  156. FPMOVE EQU *
  157.   PSHS    CC,D
  158.   LDD  0,X        MOVE OVER 2 BYTES AT A TIME
  159.   STD  0,Y
  160.   LDD  2,X
  161.   STD  2,Y
  162.   LDD  4,X
  163.   STD  4,Y
  164.   LDD  6,X
  165.   STD  6,Y
  166.   LDD  8,X
  167.   STD  8,Y
  168.   LDD  10,X
  169.   STD  10,Y
  170.   LDA  12,X
  171.   STA  12,Y
  172.   PULS CC,D,PC        RESTORE REGS AND RETURN
  173. *
  174. ******************************************************
  175. *
  176. *    SHIFTR --
  177. *     THIS SUBROUTINE TAKES THE PLACE OF THE 9-BYTE
  178. *    RIGHT SHIFT MACRO WHERE SPACE IS CRITICAL AND
  179. *    TIME IS NOT.
  180. *
  181. SHIFTR EQU *
  182.   RSHIFT   0,X,9
  183.   RTS
  184. *
  185. ********************************************************
  186. *
  187. *    COMP2 --
  188. *     PREFORMS A TWO'S COMPLEMENT ON THE VALUE
  189. * POINTED AT BY THE X-REG. WHOSE LEAST SIGNIFICANT
  190. * BYTE IS GIVEN BY THE OFFSET IN THE B-REG.
  191. *
  192. COMP2 EQU  *
  193. *
  194.   TFR  B,A         SAVE OFFSET FOR FUTURE
  195.   WHILE  A,GE,#0
  196.     COM  A,X
  197.     DECA
  198. *
  199.   ENDWH
  200. *
  201.   LDA  #01
  202.   WHILE  B,GE,#0
  203.     IFTST  A,NE
  204.       ADDA  B,X
  205.       STA  B,X
  206.       LDA  #00
  207.       ROLA
  208. *
  209.     ELSE
  210.       LDB  #$FF
  211. *
  212.     ENDIF
  213.     DECB
  214.   ENDWH
  215. *
  216.   RTS             RETURN
  217. *
  218. *
  219. ****************************************************
  220. *
  221. * PROCEDURE  FILSKY
  222. *
  223. *     OR'S ALL BITS IN THE FRACTION AND G-BIT INTO
  224. * THE STIKY BYTE. ALSO ZEROS OUT THE FRACTION AND THE
  225. * GUARD BIT.
  226. *
  227. *  ON ENTRY: X - POINTS AT THE STACK FRAME ARGUMENT
  228. *
  229. *  ON EXIT: X,Y,D,CC,U,S - UNCHANGED
  230. *
  231. FILSKY EQU  *
  232. *
  233.   PSHS    X,Y,D,CC           SAVE CALLERS REGISTERS
  234. *
  235. * GET OFFSET TO THE G-BYTE
  236. *
  237.   LEAY    GOSET,PCR           G - OFFSET TABLE
  238.   LDB  RPREC,U               PRECISION INDEX
  239.   LSRB                   HALVE OFFSET
  240.   LDA  B,Y               OFFSET FROM FRACT
  241.   ADDA    #FRACT               OFFSET FROM SIGN
  242. *
  243. *  START ORING THE BYTES OF FRACTION AND G-BIT INTO STIKY
  244. * NOTE THAT THE ROUND BITS IN THE SAME BYTE AS THE G BYTE
  245. * GET ORED AND ZEROED OUT AS WELL.
  246. *
  247.   CLRB                   STIKY ACCUMULATOR
  248.   WHILE  A,GE,#FRACT
  249.     ORB  A,X
  250.     CLR  A,X
  251.     DECA
  252. *
  253.   ENDWH
  254. *
  255.   ORB  STIKY,U               MODIFY STIKY
  256.   STB  STIKY,U
  257. *
  258. *
  259.   PULS    X,Y,D,CC,PC           RETURN
  260. *
  261. *
  262. *********************************************************
  263. *
  264. *  PROCEDURE  DENORM
  265. *
  266. *    DENORMALIZES A FLOATING PT. FRACTION AND ORS THE
  267. * BITS THAT FALL OFF THE END AS WELL AS THOSE BEYOND
  268. * THE PROCISION OF FLOATING VALUE INTO THE STIKY BYTE.
  269. * THE SHIFT COUNT FOR DENORMALIZING IS PASSED IN THE
  270. * B - REG. .
  271. *
  272. * ON ENTRY: X - POINTS TO THE STACK FRAME ARGUMENT
  273. *        B - CONTAINS THE SHIFT COUNT
  274. *
  275. * ON EXIT: X,Y,D,CC,U,S - UNCHANGED
  276. *
  277. DENORM EQU  *
  278. *
  279.   PSHS    X,Y,D,CC
  280. *
  281.   CLRA               STIKY ACCUMULATOR
  282.   WHILE  B,GT,#00
  283.     ANDCC  #NC           CLEAR CARRY
  284.     RSHIFT  FRACT,X,9        DO THE SHIFT
  285. *
  286.     IFCC  CS           IF CARRY SET
  287.       ROLA
  288.     ENDIF
  289. *
  290.     DECB
  291. *
  292.   ENDWH
  293. *
  294. * OR ALL BYTES BEYOND THE GUARD BYTE INTO THE
  295. * STIKY BYTE.
  296. *
  297.   LEAY    GOSET,PCR       G - BYTE OFFSET TABLE
  298.   LDB  RPREC,U           GET PRECISION
  299.   LSRB               HALVE  OFFSET
  300.   LDB  B,Y           G- BYTE OFFSET
  301.   ADDB    #FRACT+1       ADJUST OFFSET FOR FRACT
  302. *
  303.   WHILE  B,LT,#(ARGSIZ-1)
  304.     ORA  B,X
  305.     INCB
  306. *
  307.   ENDWH
  308. *
  309.   ORA  STIKY,U
  310.   STA  STIKY,U
  311. *
  312. *
  313.   PULS    X,Y,D,CC,PC
  314. *
  315.